package com.zw.a.basic.a13.demo14_model;

//案例: 演示生产者和消费者设计模式(简称: 消费者设计模型).
/*
    需求:
        奶箱类(Box)：定义一个成员变量，表示第x瓶奶，提供存储牛奶和获取牛奶的操作
        生产者类(Producer)：实现Runnable接口，重写run()方法，调用存储牛奶的操作
        消费者类(Customer)：实现Runnable接口，重写run()方法，调用获取牛奶的操作
        测试类(BoxDemo)：里面有main方法，main方法中的代码步骤如下
        ①创建奶箱对象，这是共享数据区域
        ②创建生产者对象，把奶箱对象作为构造方法参数传递，因为在这个类中要调用存储牛奶的操作
        ③创建消费者对象，把奶箱对象作为构造方法参数传递，因为在这个类中要调用获取牛奶的操作
        ④创建2个线程对象，分别把生产者对象和消费者对象作为构造方法参数传递
        ⑤启动线程

     设计模式:
        概述:
            实际开发中, 我们发现好多模块中的部分功能都是相似的, 每次写很麻烦, 于是我们可以把它们抽取出来, 定义成模型,
            这样按照模型做出来的东西就是符合某种规范的, 或者具有某些特性的, 这些模型就叫: 设计模式.

            大白话解释:  设计模式并不是一种语法, 而是前辈们总结的一系列的解决问题的思路和代码的解决方案, 设计模式一共分为 23 种.

        分类:
            创建型:    5种, 主要是用来创建对象的.
                单例设计模式.
                工厂方法设计模型.
            结构型:    7种, 主要是用来描述类与类之间的关系.
                适配器设计模式             装饰类                                  被装饰的类
                装饰设计模式              BufferedReader br = new BufferedReader(new FileReader("1.txt"));
            行为型:    11种, 主要指的是事物能够做什么.
                消费设计模式.
                模板方法设计模式.
 */
public class BoxDemo {
    public static void main(String[] args) {
        // ①创建奶箱对象，这是共享数据区域
        Box b = new Box();
        // ②创建生产者对象，把奶箱对象作为构造方法参数传递，因为在这个类中要调用存储牛奶的操作
        Producer p = new Producer(b);
        // ③创建消费者对象，把奶箱对象作为构造方法参数传递，因为在这个类中要调用获取牛奶的操作
        Customer c = new Customer(b);
        // ④创建2个线程对象，分别把生产者对象和消费者对象作为构造方法参数传递
        Thread t1 = new Thread(p);
        Thread t2 = new Thread(c);
        // ⑤启动线程
        t1.start();
        t2.start();
    }
}
